# -*- encoding: utf-8 -*-
'''
@File    :   3.py
@Time    :   2022/11/29 15:19:57
@Author  :   Cms 
@Version :   1.0
@Contact :   2267000140@qq.com
@WebSite    :   www.baidu.com
'''

# here put the import lib
import math
import time
from multiprocessing import Pool

# 3  多进程练习：
# 计算1～100000之间所有素数的个数， 要求如下:
# - 编写函数判断一个数字是否为素数，然后统计素数的个数；
# -对比1: 对比使用多进程和不使用多进程两种方法的统计速度。
# -对比2：对比开启4个多进程和开启10个多进程两种方法的速度。

def isPrimeNumber(arg):
    for i in range(2,int(math.sqrt(arg))):
        if(arg%i==0):
            return False
    num += 1
    return True

# 第一种方法
# time_begin = time.time()
# num = 0
# for i in range(1,100001):
#     if(isPrimeNumber(i)):
#         num += 1
# print("素数的个数为：",num)

# time_end = time.time()

# print("运行时间：",time_end-time_begin)

if __name__ == "__main__":

    # 第二种方法，采用4个多进程
    po = Pool(4)
    time_begin = time.time()
    for i in range(1,100001):
        po.apply_async(isPrimeNumber,(i,))
    po.close()  # 关闭进程池，关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成，必须放在close语句之后
    time_end = time.time()

    print("时间为：",time_end-time_begin)


    #     
    po2 = Pool(10)
    time_begin = time.time()
    for i in range(1,100001):
        po2.apply_async(isPrimeNumber,(i,))
    po2.close()  # 关闭进程池，关闭后po不再接收新的请求
    po2.join()  # 等待po中所有子进程执行完成，必须放在close语句之后
    time_end = time.time()

    print("时间为：",time_end-time_begin)

